package net.daoke.relation.web;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import net.daoke.relation.model.domain.NodeDomain;
import net.daoke.relation.model.request.MergeNodeVO;
import net.daoke.relation.service.NodeService;
import org.springframework.web.bind.annotation.*;

@Tag(name = "节点管理")
@RestController
@RequestMapping("/node")
@AllArgsConstructor
public class NodeController {

    private final NodeService nodeService;

    @Operation(summary = "获取节点信息（编号）", description = "获取节点信息")
    @GetMapping("/no")
    public NodeDomain getNodeDomain(@Schema(description = "节点编号") String nodeNo) {
        return nodeService.getNodeByNo(nodeNo);
    }

    @Operation(summary = "获取节点信息（IP）", description = "获取节点信息")
    @GetMapping("/ip")
    public NodeDomain getNodeByIp(@Schema(description = "节点IP地址") String ip) {
        return nodeService.getNodeByIp(ip);
    }

    /**
     * 合并节点<br>
     * 将多个节点合并为一个，默认使用第一个节点的属性作为合并后的节点属性，其余节点的属性将被忽略，目标节点为空时，将创建一个新的节点
     * @param nodeNos 节点编号列表
     * @param targetNo 目标节点编号，为空时，将创建一个新的
     * @return 合并后的节点
     * @deprecated 合并节点时，需要考虑节点的类型和属性是否一致
     */
    @Operation(summary = "合并节点", description = "将多个节点合并为一个，默认使用第一个节点的属性作为合并后的节点属性，其余节点的属性将被忽略，目标节点为空时，将创建一个新的节点<br>合并节点时，需要考虑节点的类型和属性是否一致<br><ol><li>获取源节点列表中的第一个节点，若节点不存在则直接报错</li><li>判断目标节点是否存在，不存在则新创建一个节点</li><li>获取源节点列表中所有关联的关系</li><li>把关系指向到新的目标节点</li><li>返回目标节点信息</li></ol>")
    @PostMapping("/merge")
    public NodeDomain mergeNode(@RequestBody MergeNodeVO mergeNodeVO) {
        return nodeService.mergeNode(mergeNodeVO);
    }
}
